package com.brian.hystrix.web.controller;

import com.brian.hystrix.web.service.RemoteService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 *
 * 浏览器调用http://127.0.0.1/test/user可以看到正常返回的结果。调整Thread.sleep的时间为3000，可以看到fallback函数返回的结果。

 从上面的例子可以快速体会到Hystrix给远程服务调用带来的好处，只需要简单的配置一个注解，就能给远程服务加上超时时间&错误回调。

 Hystrix可以支持RPC、DB、HTTP等远程服务的超时&错误回调，甚至可以做本地服务的超时&错误回调。刚刚的例子就是模拟本地服务执行超时的情况。

 一般来说，RPC框架都有基本的超时机制，但是错误处理和功能降级往往要自己来实现，Hystrix帮我省略了这部分冗余的代码，只需要写一个回调函数，简单配置一下就完工了。

 * Created by Brian on 2018/4/25 16:02
 */
@RestController
@RequestMapping({"/test"})
public class UserController {

    @Autowired
    private RemoteService remoteService;

    @RequestMapping(value = "/user")
    @HystrixCommand(fallbackMethod = "fallback", threadPoolProperties = {
            @HystrixProperty(name = "coreSize", value = "30"), @HystrixProperty(name = "maxQueueSize", value = "100"),
            @HystrixProperty(name = "queueSizeRejectionThreshold", value = "20")}, commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000"),
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "1")

    })
    public Object getUser() throws InterruptedException {
        Object user = remoteService.getUser();
        return user;
    }

    public Object fallback(Throwable e) {
        e.printStackTrace();
        return "test";
    }
}

